home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Games / Doom / ADoom-0.8 / ADoom_src / c2p_040.s < prev    next >
Text File  |  1998-06-24  |  11KB  |  552 lines

  1.         mc68020
  2.         multipass
  3.     if (_eval(DEBUG)&$8000)
  4.         debug    on,lattice4
  5.     endc
  6.  
  7. ; Chunky2Planar algorithm, originally by James McCoull
  8. ; Modified by Peter McGavin for variable size and depth
  9. ; and "compare buffer" (hope I didn't slow it down too much)
  10. ;
  11. ;     Cpu only solution VERSION 2
  12. ;    Optimised for 040+fastram
  13. ;    bitplanes are assumed contiguous!
  14. ;    analyse instruction offsets to check performance
  15.  
  16. ;void __asm c2p_6_040 (register __a0 UBYTE *chunky_data,
  17. ;                      register __a1 PLANEPTR raster,
  18. ;                      register __a2 UBYTE *compare_buffer,
  19. ;                      register __a4 UBYTE *xlate,
  20. ;                      register __d1 ULONG plsiz,
  21. ;                      register __d2 BOOL force_update);
  22.  
  23. ;void __asm c2p_8_040 (register __a0 UBYTE *chunky_data,
  24. ;                      register __a1 PLANEPTR raster,
  25. ;                      register __a2 UBYTE *compare_buffer,
  26. ;                      register __d1 ULONG plsiz);
  27.  
  28. ; a0 -> width*height chunky pixels
  29. ; a1 -> contiguous bitplanes
  30. ; a2 -> compare buffer
  31. ; d1 = width*height/8   (width*height must be a multiple of 32)
  32.  
  33.     ifeq    depth-8
  34.         xdef    _c2p_8_040
  35. _c2p_8_040:
  36.     else
  37.     ifeq    depth-6
  38.         xdef    _c2p_6_040
  39. _c2p_6_040:
  40.     else
  41.         fail    "unsupported depth!"
  42.     endc
  43.     endc
  44.  
  45. merge        macro ; in1,in2,tmp3,tmp4,mask,shift
  46. ; \1 = abqr
  47. ; \2 = ijyz
  48.         move.l    \2,\4
  49.         move.l    #\5,\3
  50.         and.l    \3,\2    ; \2 = 0j0z
  51.         and.l    \1,\3    ; \3 = 0b0r
  52.         eor.l    \3,\1    ; \1 = a0q0
  53.         eor.l    \2,\4    ; \4 = i0y0
  54.         ifeq    \6-1
  55.         add.l    \3,\3
  56.         else
  57.         lsl.l    #\6,\3    ; \3 = b0r0
  58.         endc
  59.         lsr.l    #\6,\4    ; \4 = 0i0y
  60.         or.l    \3,\2    ; \2 = bjrz
  61.         or.l    \4,\1    ; \1 = aiqy
  62.         endm
  63.  
  64. xlate        macro    ; translate 4 8-bit pixels to 6-bit EHB
  65.         move.b    (\1,a0),d7
  66.         move.b    (a4,d7.w),\2
  67.         lsl.w    #8,\2
  68.         move.b    (\1+8,a0),d7
  69.         move.b    (a4,d7.w),\2
  70.         swap    \2
  71.         move.b    (\1+16,a0),d7
  72.         move.b    (a4,d7.w),\2
  73.         lsl.w    #8,\2
  74.         move.b    (\1+24,a0),d7
  75.         move.b    (a4,d7.w),\2
  76.         endm
  77.  
  78. start:        movem.l    d2-d7/a2-a6,-(sp)
  79.  
  80.         sub.w    #46,sp        ; space for temporary variables
  81.  
  82.     ifle depth-6
  83.         move.w    d2,(44,sp)    ; video_force_update
  84.     endc
  85.  
  86. ; a0 = chunky buffer
  87. ; a1 = output area
  88. ; a2 = compare buffer
  89. ; d1 = plsiz
  90.  
  91.         movea.l    d1,a3        ; a3 = plsiz
  92.  
  93.         move.l    a0,(40,sp)
  94.         lsl.l    #3,d1
  95.         add.l    d1,(40,sp)    ; (40,sp) -> end of chunky data
  96.  
  97. first_loop:
  98.     ifle depth-6
  99.         tst.w    (44,sp)        ; force_update?
  100.         bne.b    first_case
  101.     endc
  102.         cmpm.l    (a0)+,(a2)+
  103.         bne.b    stub1
  104.         cmpm.l    (a0)+,(a2)+
  105.         bne.b    stub2
  106.         cmpm.l    (a0)+,(a2)+
  107.         bne.b    stub3
  108.         cmpm.l    (a0)+,(a2)+
  109.         bne.b    stub4
  110.         cmpm.l    (a0)+,(a2)+
  111.         bne.b    stub5
  112.         cmpm.l    (a0)+,(a2)+
  113.         bne.b    stub6
  114.         cmpm.l    (a0)+,(a2)+
  115.         bne.b    stub7
  116.         cmpm.l    (a0)+,(a2)+
  117.         bne.b    stub8
  118.  
  119.         addq.l    #4,a1        ; skip 32 pixels on output
  120.  
  121.         cmpa.l    (40,sp),a0
  122.         bcs.b    first_loop
  123.         bra.w    exit        ; exit if no changes found
  124.  
  125. stub8:        subq.l    #4,a0
  126.         subq.l    #4,a2
  127. stub7:        subq.l    #4,a0
  128.         subq.l    #4,a2
  129. stub6:        subq.l    #4,a0
  130.         subq.l    #4,a2
  131. stub5:        subq.l    #4,a0
  132.         subq.l    #4,a2
  133. stub4:        subq.l    #4,a0
  134.         subq.l    #4,a2
  135. stub3:        subq.l    #4,a0
  136.         subq.l    #4,a2
  137. stub2:        subq.l    #4,a0
  138.         subq.l    #4,a2
  139. stub1:        subq.l    #4,a0
  140.         subq.l    #4,a2
  141.  
  142. first_case:
  143.     ifgt depth-6        ; depth 8 code --- no need to xlate pixels
  144.         move.l    (0,a0),d1
  145.          move.l    (4,a0),d3
  146.         move.l    (8,a0),d0
  147.         move.l    (12,a0),d2
  148.         move.l    (2,a0),d4
  149.          move.l    (10,a0),d5
  150.         move.l    (6,a0),d6
  151.         move.l    (14,a0),d7
  152.  
  153.         move.l    d1,(0,a2)
  154.         move.l    d3,(4,a2)
  155.         move.l    d0,(8,a2)
  156.         move.l    d2,(12,a2)
  157.  
  158.          move.w    (16,a0),d1
  159.          move.w    (24,a0),d0
  160.         move.w    (20,a0),d3
  161.         move.w    (28,a0),d2
  162.          move.w    (18,a0),d4
  163.          move.w    (26,a0),d5
  164.         move.w    (22,a0),d6
  165.         move.w    (30,a0),d7
  166.  
  167.          move.w    d1,(16,a2)
  168.          move.w    d0,(24,a2)
  169.         move.w    d3,(20,a2)
  170.         move.w    d2,(28,a2)
  171.          move.w    d4,(18,a2)
  172.          move.w    d5,(26,a2)
  173.         move.w    d6,(22,a2)
  174.         move.w    d7,(30,a2)
  175.  
  176.         move.l    d6,a5
  177.         move.l    d7,a6
  178.  
  179.         merge    d1,d0,d6,d7,$00ff00ff,8
  180.         merge    d3,d2,d6,d7,$00ff00ff,8
  181.  
  182.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  183.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  184.  
  185.         exg    d1,a5
  186.         exg    d0,a6
  187.  
  188.         merge    d4,d5,d6,d7,$00ff00ff,8
  189.         merge    d1,d0,d6,d7,$00ff00ff,8
  190.  
  191.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  192.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  193.  
  194.         merge    d3,d1,d6,d7,$33333333,2
  195.         merge    d2,d0,d6,d7,$33333333,2    
  196.  
  197.         merge    d3,d2,d6,d7,$55555555,1
  198.         merge    d1,d0,d6,d7,$55555555,1
  199.  
  200.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  201.         move.l    d1,(1*4,sp)        ;plane1
  202.         move.l    d2,(2*4,sp)        ;plane2
  203.         move.l    d3,(3*4,sp)        ;plane3
  204.  
  205.         move.l    a5,d3
  206.         move.l    a6,d2
  207.  
  208.         merge    d3,d4,d6,d7,$33333333,2
  209.         merge    d2,d5,d6,d7,$33333333,2
  210.  
  211.         merge    d3,d2,d6,d7,$55555555,1
  212.         merge    d4,d5,d6,d7,$55555555,1
  213.  
  214.         move.l    d5,(4*4,sp)        ;plane4
  215.         move.l    d4,(5*4,sp)        ;plane5
  216.  
  217.         move.l    d2,(6*4,sp)        ;plane6
  218.         move.l    d3,(7*4,sp)        ;plane7
  219.  
  220.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  221.         moveq    #0,d7
  222.  
  223.         move.l    (a0),(a2)    ; copy to compare buffer
  224.         move.l    (4,a0),(4,a2)
  225.         move.l    (8,a0),(8,a2)
  226.         move.l    (12,a0),(12,a2)
  227.         move.l    (16,a0),(16,a2)
  228.         move.l    (20,a0),(20,a2)
  229.         move.l    (24,a0),(24,a2)
  230.         move.l    (28,a0),(28,a2)
  231.  
  232.         xlate    0,d1        ; does 8-bit to EHB colour translate
  233.         xlate    1,d0        ; 4 pixels at a time
  234.         xlate    4,d3
  235.         xlate    5,d2
  236.  
  237.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  238.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  239.  
  240.         movea.l    d1,a5
  241.         movea.l    d0,a6
  242.  
  243.         moveq    #0,d7
  244.  
  245.         xlate    2,d4
  246.         xlate    3,d5
  247.         xlate    6,d1
  248.         xlate    7,d0
  249.  
  250.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  251.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  252.  
  253.         merge    d3,d1,d6,d7,$33333333,2
  254.         merge    d2,d0,d6,d7,$33333333,2    
  255.  
  256.         merge    d3,d2,d6,d7,$55555555,1
  257.         merge    d1,d0,d6,d7,$55555555,1
  258.  
  259.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  260.         move.l    d1,(1*4,sp)        ;plane1
  261.         move.l    d2,(2*4,sp)        ;plane2
  262.         move.l    d3,(3*4,sp)        ;plane3
  263.  
  264.         move.l    a5,d3
  265.         move.l    a6,d2
  266.  
  267.         merge    d3,d4,d6,d7,$33333333,2
  268.         merge    d2,d5,d6,d7,$33333333,2
  269.  
  270.         merge    d4,d5,d6,d7,$55555555,1
  271.  
  272.         move.l    d5,(4*4,sp)        ;plane4
  273.         move.l    d4,(5*4,sp)        ;plane5
  274.  
  275.     endc
  276.  
  277.         adda.w    #32,a0
  278.         adda.w    #32,a2
  279.  
  280.         move.l    a1,(32,sp)        ; save output address
  281.         addq.l    #4,a1            ; skip 32 pixels on output
  282.  
  283.         cmpa.l    (40,sp),a0
  284.         bcc.w    final_case
  285.  
  286.  
  287. main_loop:
  288.     ifle depth-6
  289.         tst.w    (44,sp)        ; force_update?
  290.         bne.b    main_case
  291.     endc
  292.         cmpm.l    (a0)+,(a2)+    ; compare next 32 pixels
  293.         bne.b    mstub1
  294.         cmpm.l    (a0)+,(a2)+
  295.         bne.b    mstub2
  296.         cmpm.l    (a0)+,(a2)+
  297.         bne.b    mstub3
  298.         cmpm.l    (a0)+,(a2)+
  299.         bne.b    mstub4
  300.         cmpm.l    (a0)+,(a2)+
  301.         bne.b    mstub5
  302.         cmpm.l    (a0)+,(a2)+
  303.         bne.b    mstub6
  304.         cmpm.l    (a0)+,(a2)+
  305.         bne.b    mstub7
  306.         cmpm.l    (a0)+,(a2)+
  307.         bne.b    mstub8
  308.  
  309.         addq.l    #4,a1        ; skip 32 pixels on output
  310.  
  311.         cmpa.l    (40,sp),a0
  312.         bcs.b    main_loop
  313.         bra.w    final_case    ; exit if no more changes found
  314.  
  315. mstub8:        subq.l    #4,a0
  316.         subq.l    #4,a2
  317. mstub7:        subq.l    #4,a0
  318.         subq.l    #4,a2
  319. mstub6:        subq.l    #4,a0
  320.         subq.l    #4,a2
  321. mstub5:        subq.l    #4,a0
  322.         subq.l    #4,a2
  323. mstub4:        subq.l    #4,a0
  324.         subq.l    #4,a2
  325. mstub3:        subq.l    #4,a0
  326.         subq.l    #4,a2
  327. mstub2:        subq.l    #4,a0
  328.         subq.l    #4,a2
  329. mstub1:        subq.l    #4,a0
  330.         subq.l    #4,a2
  331.  
  332. main_case:    move.l    a1,(36,sp)    ; save current output address
  333.         move.l    (32,sp),a1    ; a1 = previous output address
  334.  
  335.     ifgt depth-6
  336.         move.l    (0,a0),d1
  337.          move.l    (4,a0),d3
  338.          move.l    (8,a0),d0
  339.         move.l    (12,a0),d2
  340.         move.l    (2,a0),d4
  341.          move.l    (10,a0),d5
  342.         move.l    (6,a0),d6
  343.         move.l    (14,a0),d7
  344.  
  345.         move.l    d1,(0,a2)
  346.         move.l    d3,(4,a2)
  347.         move.l    d0,(8,a2)
  348.         move.l    d2,(12,a2)
  349.  
  350.          move.w    (16,a0),d1
  351.          move.w    (24,a0),d0
  352.         move.w    (20,a0),d3
  353.         move.w    (28,a0),d2
  354.          move.w    (18,a0),d4
  355.          move.w    (26,a0),d5
  356.         move.w    (22,a0),d6
  357.         move.w    (30,a0),d7
  358.  
  359.          move.w    d1,(16,a2)
  360.          move.w    d0,(24,a2)
  361.         move.w    d3,(20,a2)
  362.         move.w    d2,(28,a2)
  363.          move.w    d4,(18,a2)
  364.          move.w    d5,(26,a2)
  365.         move.w    d6,(22,a2)
  366.         move.w    d7,(30,a2)
  367.  
  368.         move.l    d6,a5
  369.         move.l    d7,a6
  370.  
  371.         move.l    (0*4,sp),(a1)        ;plane0
  372.         adda.l    a3,a1            ;a1+=plsiz
  373.  
  374.         merge    d1,d0,d6,d7,$00ff00ff,8
  375.         merge    d3,d2,d6,d7,$00ff00ff,8
  376.  
  377.         move.l    (1*4,sp),(a1)        ;plane1
  378.         adda.l    a3,a1            ;a1+=plsiz
  379.  
  380.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  381.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  382.  
  383.         exg    d1,a5
  384.         exg    d0,a6
  385.  
  386.         move.l    (2*4,sp),(a1)        ;plane2
  387.         adda.l    a3,a1            ;a1+=plsiz
  388.  
  389.         merge    d4,d5,d6,d7,$00ff00ff,8
  390.         merge    d1,d0,d6,d7,$00ff00ff,8
  391.  
  392.         move.l    (3*4,sp),(a1)        ;plane3
  393.         adda.l    a3,a1            ;a1+=plsiz
  394.  
  395.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  396.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  397.  
  398.         move.l    (4*4,sp),(a1)        ;plane4
  399.         adda.l    a3,a1            ;a1+=plsiz
  400.  
  401.         merge    d3,d1,d6,d7,$33333333,2
  402.         merge    d2,d0,d6,d7,$33333333,2    
  403.  
  404.         move.l    (5*4,sp),(a1)        ;plane5
  405.         adda.l    a3,a1            ;a1+=plsiz
  406.  
  407.         merge    d3,d2,d6,d7,$55555555,1
  408.         merge    d1,d0,d6,d7,$55555555,1
  409.  
  410.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  411.         move.l    d1,(1*4,sp)        ;plane1
  412.         move.l    d2,(2*4,sp)        ;plane2
  413.         move.l    d3,(3*4,sp)        ;plane3
  414.  
  415.         move.l    a5,d3
  416.         move.l    a6,d2
  417.  
  418.         move.l    (6*4,sp),(a1)        ;plane6
  419.         adda.l    a3,a1            ;a1+=plsiz
  420.  
  421.         merge    d3,d4,d6,d7,$33333333,2
  422.         merge    d2,d5,d6,d7,$33333333,2
  423.  
  424.         move.l    (7*4,sp),(a1)        ;plane7
  425.         adda.l    a3,a1            ;a1+=plsiz
  426.  
  427.         merge    d3,d2,d6,d7,$55555555,1
  428.         merge    d4,d5,d6,d7,$55555555,1
  429.  
  430.         move.l    d5,(4*4,sp)        ;plane4
  431.         move.l    d4,(5*4,sp)        ;plane5
  432.  
  433.         move.l    d2,(6*4,sp)        ;plane6
  434.         move.l    d3,(7*4,sp)        ;plane7
  435.  
  436.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  437.         moveq    #0,d7
  438.  
  439.         move.l    (a0),(a2)
  440.         move.l    (4,a0),(4,a2)
  441.         move.l    (8,a0),(8,a2)
  442.         move.l    (12,a0),(12,a2)
  443.         move.l    (16,a0),(16,a2)
  444.         move.l    (20,a0),(20,a2)
  445.         move.l    (24,a0),(24,a2)
  446.         move.l    (28,a0),(28,a2)
  447.  
  448.         xlate    0,d1        ; does 8-bit to EHB colour translate
  449.         xlate    1,d0        ; 4 pixels at a time
  450.         xlate    4,d3
  451.         xlate    5,d2
  452.  
  453.         move.l    (0*4,sp),(a1)        ;plane0
  454.         adda.l    a3,a1            ;a1+=plsiz
  455.  
  456.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  457.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  458.  
  459.         movea.l    d1,a5
  460.         movea.l    d0,a6
  461.  
  462.         moveq    #0,d7
  463.  
  464.         xlate    2,d4
  465.         xlate    3,d5
  466.         xlate    6,d1
  467.         xlate    7,d0
  468.  
  469.         move.l    (1*4,sp),(a1)        ;plane1
  470.         adda.l    a3,a1            ;a1+=plsiz
  471.  
  472.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  473.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  474.  
  475.         move.l    (2*4,sp),(a1)        ;plane2
  476.         adda.l    a3,a1            ;a1+=plsiz
  477.  
  478.         merge    d3,d1,d6,d7,$33333333,2
  479.         merge    d2,d0,d6,d7,$33333333,2    
  480.  
  481.         move.l    (3*4,sp),(a1)        ;plane3
  482.         adda.l    a3,a1            ;a1+=plsiz
  483.  
  484.         merge    d3,d2,d6,d7,$55555555,1
  485.         merge    d1,d0,d6,d7,$55555555,1
  486.  
  487.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  488.         move.l    d1,(1*4,sp)        ;plane1
  489.         move.l    d2,(2*4,sp)        ;plane2
  490.         move.l    d3,(3*4,sp)        ;plane3
  491.  
  492.         move.l    (4*4,sp),(a1)        ;plane4
  493.         adda.l    a3,a1            ;a1+=plsiz
  494.  
  495.         move.l    a5,d3
  496.         move.l    a6,d2
  497.  
  498.         merge    d3,d4,d6,d7,$33333333,2
  499.  
  500.         move.l    (5*4,sp),(a1)        ;plane5
  501.         adda.l    a3,a1            ;a1+=plsiz
  502.  
  503.         merge    d2,d5,d6,d7,$33333333,2
  504.  
  505.         merge    d4,d5,d6,d7,$55555555,1
  506.  
  507.         move.l    d5,(4*4,sp)        ;plane4
  508.         move.l    d4,(5*4,sp)        ;plane5
  509.  
  510.     endc
  511.  
  512.         adda.w    #32,a0
  513.         adda.w    #32,a2
  514.  
  515.         movea.l    (36,sp),a1    ; restore current output address
  516.         move.l    a1,(32,sp)    ; save output address
  517.  
  518.         addq.l    #4,a1        ; skip 32 pixels on output
  519.  
  520.         cmpa.l    (40,sp),a0
  521.         bcs.w    main_loop
  522.  
  523.  
  524. final_case:    move.l    (32,sp),a1    ; a1 = previous output address
  525.  
  526.         move.l    (0*4,sp),(a1)        ;plane0
  527.         adda.l    a3,a1            ;a1+=plsiz
  528.         move.l    (1*4,sp),(a1)         ;plane1
  529.         adda.l    a3,a1            ;a1+=plsiz
  530.         move.l    (2*4,sp),(a1)        ;plane2
  531.         adda.l    a3,a1            ;a1+=plsiz
  532.         move.l    (3*4,sp),(a1)        ;plane3
  533.         adda.l    a3,a1            ;a1+=plsiz
  534.         move.l    (4*4,sp),(a1)        ;plane4    
  535.         adda.l    a3,a1            ;a1+=plsiz
  536.         move.l    (5*4,sp),(a1)        ;plane5
  537.     ifgt depth-6
  538.         adda.l    a3,a1            ;a1+=plsiz
  539.         move.l    (6*4,sp),(a1)        ;plane6
  540.         adda.l    a3,a1            ;a1+=plsiz
  541.         move.l    (7*4,sp),(a1)        ;plane7
  542.     endc
  543.  
  544. exit:        add.w    #46,sp
  545.         movem.l    (sp)+,d2-d7/a2-a6
  546.         rts
  547.  
  548.         cnop    0,4
  549. end:
  550.  
  551.         end
  552.